home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_std / directory.e < prev    next >
Text File  |  2000-03-25  |  7KB  |  236 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://SmallEiffel.loria.fr
  11. --
  12. class DIRECTORY
  13.    --
  14.    -- NOTE: THIS IS AN ALPHA VERSION. THIS CLASS IS NOT STABLE AT ALL AND 
  15.    -- MIGHT EVEN CHANGE COMPLETELY IN THE NEXT RELEASE !
  16.    -- 
  17.    --
  18.    -- Tools for file-system directory handling.
  19.    -- Hight-level facade for class BASIC_DIRECTORY.
  20.    --
  21. creation make, scan, scan_with, scan_current_working_directory
  22.    
  23. feature
  24.    
  25.    path: STRING;
  26.          -- The directory path in use (see `scan').
  27.    
  28.    last_scan_status: BOOLEAN;
  29.          -- True when last `scan' (or last `re_scan') has sucessfully 
  30.          -- read some existing directory using `path'.
  31.    
  32. feature {NONE}
  33.    
  34.    basic_directory: BASIC_DIRECTORY;
  35.          -- Provide low level access to directories.
  36.    
  37.    name_list: FIXED_ARRAY[STRING];
  38.          -- Actual list of entries (files or subdirectories)..
  39.    
  40.    make is
  41.          -- Make a new not assigned one.
  42.       do
  43.          if name_list = Void then
  44.             !!name_list.with_capacity(32);
  45.          else
  46.             name_list.clear;
  47.          end;
  48.       ensure
  49.          is_empty
  50.       end;
  51.    
  52. feature -- Disk access :
  53.    
  54.    scan(directory_path: STRING) is
  55.          -- Try to scan some existing `directory_path' which is 
  56.          -- supposed to be a correctly spelled directory path.
  57.          -- Afetr this call the client is supposed to check `last_scan_status'
  58.          -- to know.
  59.          -- So, when `last_scan_status' is true after this call, the entire 
  60.          -- directory has been read.
  61.       require
  62.          not directory_path.is_empty
  63.       local
  64.          entry: STRING;
  65.       do
  66.          if name_list = Void then
  67.             make;
  68.          end;
  69.          path := directory_path;
  70.          basic_directory.connect_to(path);
  71.          if basic_directory.is_connected then
  72.             from
  73.                basic_directory.read_entry;
  74.             until
  75.                basic_directory.end_of_input
  76.             loop
  77.                entry := basic_directory.last_entry.twin;
  78.                name_list.add_last(entry);
  79.                basic_directory.read_entry;
  80.             end;
  81.             basic_directory.disconnect;
  82.             last_scan_status := true;
  83.          else
  84.             name_list.clear;
  85.             last_scan_status := false;
  86.          end;
  87.       end;
  88.    
  89.    scan_with(some_path: STRING) is
  90.          -- Try to scan `Current' using `some_path' where `some_path' can be
  91.          -- either a file path or an existing directory path.
  92.          -- When `some_path' is a directory path, the behavior is equivalent 
  93.          -- to `connect_to'.
  94.          -- When `some_path' is the path of an existing file, the directory
  95.          -- which contains this file is scanned.
  96.       require
  97.          not some_path.is_empty
  98.       do
  99.          scan(some_path);
  100.          if not last_scan_status then
  101.             basic_directory.connect_with(some_path);
  102.             if basic_directory.is_connected then
  103.                path := basic_directory.last_entry.twin;
  104.                basic_directory.disconnect;
  105.                scan(path);
  106.             end;
  107.          end;
  108.       end;
  109.  
  110.    re_scan is
  111.          -- Update internal information by reloading all the information 
  112.          -- about the `path' directory from the disk.
  113.          -- Update `last_scan_status', `count', and all `item's.
  114.       require
  115.          path /= void
  116.       local
  117.          entry: STRING;
  118.          i: INTEGER;
  119.       do
  120.          check 
  121.             not name_list.empty
  122.          end;
  123.          basic_directory.connect_to(path);
  124.          if basic_directory.is_connected then
  125.             from
  126.                basic_directory.read_entry;
  127.             until
  128.                basic_directory.end_of_input
  129.             loop
  130.                if name_list.valid_index(i) then
  131.                   entry := name_list.item(i);
  132.                   if not basic_directory.last_entry.is_equal(entry) then
  133.                      entry := basic_directory.last_entry.twin;
  134.                      name_list.put(entry,i);
  135.                   end;
  136.                else
  137.                   entry := basic_directory.last_entry.twin;
  138.                   name_list.add_last(entry);
  139.                end;
  140.                basic_directory.read_entry;
  141.                i := i + 1;
  142.             end;
  143.             basic_directory.disconnect;
  144.             name_list.resize(i);
  145.             last_scan_status := true;
  146.          else
  147.             name_list.clear;
  148.             last_scan_status := false;
  149.          end;
  150.       end;
  151.  
  152.    scan_current_working_directory is
  153.       local
  154.          entry: STRING;
  155.       do
  156.          if name_list = Void then
  157.             make;
  158.          end;
  159.          name_list.clear;
  160.          basic_directory.connect_to_current_working_directory;
  161.          if basic_directory.is_connected then
  162.             path := basic_directory.last_entry.twin;
  163.             from
  164.                basic_directory.read_entry;
  165.             until
  166.                basic_directory.end_of_input
  167.             loop
  168.                entry := basic_directory.last_entry.twin;
  169.                name_list.add_last(entry);
  170.                basic_directory.read_entry;
  171.             end;
  172.             basic_directory.disconnect;
  173.             last_scan_status := true;
  174.          else
  175.             last_scan_status := false;
  176.          end;
  177.       end;
  178.  
  179. feature -- Access :
  180.    
  181.    lower: INTEGER is 1;
  182.          -- Index of the first item.
  183.    
  184.    upper: INTEGER is
  185.          -- Index of the last item.
  186.       do
  187.          Result := name_list.upper + 1;
  188.       end;
  189.    
  190.    count: INTEGER is
  191.          -- Number of items (files or directories) in Current.
  192.       do
  193.          Result := name_list.count;
  194.       ensure
  195.          Result >= 0
  196.       end;
  197.  
  198.    is_empty: BOOLEAN is
  199.       do
  200.          Result := count = 0;
  201.       ensure
  202.          definition: Result = (count = 0)
  203.       end;
  204.    
  205.    valid_index(index: INTEGER): BOOLEAN is
  206.       do
  207.          if index >= 1 then
  208.             Result := index <= name_list.upper + 1;
  209.          end;
  210.       ensure
  211.          Result = (lower <= index and index <= upper)
  212.       end;
  213.    
  214.    name(index: INTEGER): STRING is
  215.          -- Return the name of entry (file or subdirectory) at `index'.
  216.       require
  217.          valid_index(index)
  218.       do
  219.          Result := name_list.item(index - 1);
  220.       ensure
  221.          has(Result)
  222.       end;
  223.  
  224.    has(entry_name: STRING): BOOLEAN is
  225.          -- Does Current contain the `entry_name' (file or subdirectory) ?
  226.       require
  227.          not entry_name.is_empty
  228.       do
  229.          if name_list.upper >= 0 then
  230.             Result := name_list.has(entry_name);
  231.          end;
  232.      end;
  233.  
  234. end -- DIRECTORY
  235.  
  236.